package com.kktoolbox;

import javax.swing.*;
import java.awt.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import com.kktoolbox.ui.DocumentSearchFrame;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 主菜单界面 - KK-Toolbox应用程序的主入口
 * <p>这是应用程序的主界面，作为用户与各个功能模块交互的起始点。
 * 提供了一个直观、易用的图形界面，让用户可以方便地选择和启动不同的功能模块。</p>
 * 
 * @author KK-Toolbox
 * @version 1.0.0
 * @since 2025-01-01
 */
public class MainMenuFrame extends JFrame {
    
    /** 日志记录器，用于记录应用程序运行状态和错误信息 */
    private static final Logger logger = LoggerFactory.getLogger(MainMenuFrame.class);
    
    /** 应用程序版本号 */
    private static final String APP_VERSION = loadVersion();
    
    /** 应用程序名称 */
    private static final String APP_NAME = "HPP-Toolbox";
    
    /** 窗口默认宽度 */
    private static final int WINDOW_WIDTH = 500;
    
    /** 窗口默认高度 */
    private static final int WINDOW_HEIGHT = 400;
    
    /**
     * 构造函数 - 初始化主菜单界面
     * <p>设置窗口基本属性，包括标题、大小、关闭操作等，
     * 并构建主界面布局，包含标题、功能选择和版本信息三个区域。</p>
     */
    public MainMenuFrame() {
        // 设置窗口标题，包含应用名称和版本号
        setTitle(APP_NAME + " v" + APP_VERSION);
        // 设置窗口关闭操作为退出程序
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 设置窗口大小
        setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
        // 禁止调整窗口大小
        setResizable(false);
        // 创建主面板使用BorderLayout布局
        JPanel mainPanel = new JPanel(new BorderLayout());
        setContentPane(mainPanel);

        // 顶部标题面板
        mainPanel.add(createTitlePanel(), BorderLayout.NORTH);
        // 中部功能选择面板
        mainPanel.add(createFunctionPanel(), BorderLayout.CENTER);
        // 底部版本信息面板
        mainPanel.add(createVersionPanel(), BorderLayout.SOUTH);
        // 设置窗口居中显示
        setLocationRelativeTo(null);
    }

    /**
     * 应用程序主入口点
     * <p>程序启动入口，负责初始化UI外观并创建主菜单窗口。</p>
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 设置系统外观
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            LoggerFactory.getLogger(MainMenuFrame.class)
                    .warn("无法设置系统外观，使用默认外观: {}", e.getMessage());
        }

        // 在事件调度线程中启动应用程序
        SwingUtilities.invokeLater(() -> {
            MainMenuFrame mainFrame = new MainMenuFrame();
            mainFrame.setVisible(true);
        });
    }
    
    /**
     * 创建标题面板
     * <p>创建包含应用程序名称和副标题的顶部面板，
     * 为用户提供清晰的应用程序标识。</p>
     * 
     * @return 配置好的标题面板
     */
    private JPanel createTitlePanel() {
        // 创建使用BorderLayout布局的面板
        JPanel panel = new JPanel(new BorderLayout());
        // 设置面板边距，上30左20下20右20
        panel.setBorder(BorderFactory.createEmptyBorder(30, 20, 20, 20));

        // 主标题标签，使用微软雅黑字体，粗体，28号字，深蓝色
        JLabel titleLabel = new JLabel(APP_NAME, JLabel.CENTER);
        titleLabel.setFont(new Font("微软雅黑", Font.BOLD, 28));
        titleLabel.setForeground(new Color(51, 102, 153));

        // 副标题标签，使用微软雅黑字体，普通体，14号字，灰色
        JLabel subtitleLabel = new JLabel("黄PP的工具小黑匣", JLabel.CENTER);
        subtitleLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14));
        subtitleLabel.setForeground(new Color(102, 102, 102));

        // 标题容器，用于组织主标题和副标题的布局
        JPanel titleContainer = new JPanel(new BorderLayout());
        titleContainer.add(titleLabel, BorderLayout.NORTH);
        titleContainer.add(Box.createVerticalStrut(5), BorderLayout.CENTER); // 添加5像素垂直间距
        titleContainer.add(subtitleLabel, BorderLayout.SOUTH);

        panel.add(titleContainer, BorderLayout.CENTER);

        return panel;
    }

    /**
     * 创建版本信息面板
     * <p>创建显示应用程序版本信息和开发者信息的底部面板。</p>
     *
     * @return 配置好的版本信息面板
     */
    private JPanel createVersionPanel() {
        // 创建使用FlowLayout布局的面板，组件居中对齐
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        // 设置面板边距，上10左20下20右20
        panel.setBorder(BorderFactory.createEmptyBorder(10, 20, 20, 20));

        // 版本信息标签，使用微软雅黑字体，普通体，12号字，浅灰色
        JLabel versionLabel = new JLabel("版本 " + APP_VERSION + " | 开发者：KK-Toolbox");
        versionLabel.setFont(new Font("微软雅黑", Font.PLAIN, 12));
        versionLabel.setForeground(new Color(128, 128, 128));

        panel.add(versionLabel);
        return panel;
    }
    
    /**
     * 创建功能选择面板
     * <p>创建包含文档搜索按钮的中央面板。</p>
     * 
     * @return 配置好的功能选择面板
     */
    private JPanel createFunctionPanel() {
        
        // 创建使用GridBagLayout布局的面板
        JPanel panel = new JPanel(new GridBagLayout());
        // 设置面板边距，上20左40下20右40
        panel.setBorder(BorderFactory.createEmptyBorder(20, 40, 20, 40));
        
        // 创建网格布局约束对象
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(10, 0, 10, 0); // 设置组件间距，上下10像素
        gbc.fill = GridBagConstraints.HORIZONTAL; // 水平填充
        gbc.weightx = 1.0; // 水平方向权重为1.0
        
        // 文档搜索按钮
        JButton searchButton = new JButton("文档搜索");
        // 鼠标悬停,展示提示信息
        searchButton.setToolTipText("搜索PDF和Word文档中的文本内容");
        // 添加按钮点击事件监听器
        searchButton.addActionListener(e -> openDocumentSearchModule());
        gbc.gridy = 0; // 设置网格y坐标为0
        panel.add(searchButton, gbc);
        
        logger.debug("功能选择面板创建完成，包含1个功能按钮");
        return panel;
    }
    
    /**
     * 打开文档搜索模块
     * <p>启动统一的文档搜索功能模块，支持PDF、Word和综合搜索。</p>
     */
    private void openDocumentSearchModule() {
        logger.info("用户选择打开文档搜索模块");
        try {
            // 隐藏主菜单窗口
            this.setVisible(false);
            // 创建文档搜索窗口，传入当前主菜单实例作为返回引用
            DocumentSearchFrame searchFrame = new DocumentSearchFrame(this);
            searchFrame.setVisible(true);
        } catch (Exception e) {
            logger.error("启动文档搜索模块时发生错误: {}", e.getMessage(), e);
            this.setVisible(true); // 发生错误时重新显示主菜单
        }
    }
    
    /**
     * 从版本属性文件加载版本信息
     * @return 版本号字符串，如果加载失败则返回默认版本号
     */
    private static String loadVersion() {
        try (InputStream input = MainMenuFrame.class.getClassLoader().getResourceAsStream("version.properties")) {
            if (input == null) {
                logger.warn("无法找到version.properties文件，使用默认版本号");
                return "1.0.0";
            }
            
            Properties properties = new Properties();
            properties.load(input);
            String version = properties.getProperty("app.version", "1.0.0");
            logger.debug("从配置文件加载版本号: {}", version);
            return version;
        } catch (IOException e) {
            logger.error("读取版本配置文件时发生错误: {}", e.getMessage(), e);
            return "1.0.0";
        }
    }
}